package com.info33.platform.system.controller;

import java.util.List;

import javax.validation.Valid;

import io.swagger.annotations.Api;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.info33.platform.system.dto.SysNewsDTO;
import com.info33.platform.system.entity.SysNews;
import com.info33.platform.system.service.SysNewsService;
import com.info33.platform.common.mvc.controller.BaseController;
import com.info33.platform.common.mvc.vo.Result;
import com.info33.platform.system.util.enums.UserTypeEnum;

import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping("/SysNews")
@Api(tags = "系统 - 新闻中心")
public class SysNewsController extends BaseController<SysNewsService, SysNews>{

	private final SysNewsService sysNewsService;
	public SysNewsController(SysNewsService baseService) {
		super(baseService);
		this.sysNewsService = baseService;
	}

	/********************************************************************************
	 * @Title: get
	 * @Description: 通过id获取新闻中心详情
	 ********************************************************************************/
	@GetMapping(value = "/{id}")
	@ApiOperation(value = "获取新闻中心详情", notes = "通过ID获取新闻中心详情")
	public Result<SysNews> get(@PathVariable(value = "id") Long id) throws Exception {
		return Result.ok(sysNewsService.getById(id));
	}

	/********************************************************************************
	 * @Title: getlist
	 * @Description: 通过条件获取新闻中心全部列表
	 ********************************************************************************/
	@PostMapping(value = "/list")
	@ApiOperation(value = "获取新闻中心详情", notes = "通过条件获取新闻中心详情 pageNum 和 pageSize 都为 0 的时候就是查询全部数据")
	public Result<List<SysNews>> getlist(@RequestBody SysNews sysNews) throws Exception {
		return Result.ok(sysNewsService.list(new QueryWrapper<SysNews>(sysNews)));
	}
	
	/********************************************************************************
	 * @Title: getlist
	 * @Description: 通过条件获取新闻中心分页列表
	 ********************************************************************************/
	@PostMapping(value = "/list/page/{pageNum}/{pageSize}")
	@ApiOperation(value = "获取新闻中心详情", notes = "通过条件获取新闻中心详情")
	public Result<IPage<SysNews>> getlist(@RequestBody SysNews sysNews, @PathVariable int pageNum, @PathVariable int pageSize) throws Exception {
		IPage<SysNews> page = new Page<SysNews>(pageNum, pageSize);
		return Result.ok(sysNewsService.page(page, new QueryWrapper<SysNews>(sysNews)));
	}
	

	/********************************************************************************
	 * @Title: add
	 * @Description: 新增单个新闻中心详情
	 ********************************************************************************/
	@PostMapping("/add")
	@ApiOperation(value = "新增单个新闻中心详情", notes = "新增单个新闻中心详情")
	public Result<SysNews> add(@Valid @RequestBody SysNewsDTO sysNewsDTO, BindingResult bindingResult)  throws Exception {
		SysNews sysNews = new SysNews();
		BeanUtils.copyProperties(sysNewsDTO, sysNews);
		sysNews.setCreateName(getCurrentUser().getTrueName());
		sysNews.setTenantId(getTenantId());
		return sysNewsService.save(sysNews)?Result.ok(sysNewsService.getById(sysNews.getId())):Result.error();
	}

	/********************************************************************************
	 * @Title: addBatch
	 * @Description: 新增多个新闻中心详情
	 ********************************************************************************/
	@PostMapping("/addBatch")
	@ApiOperation(value = "新增多个新闻中心详情", notes = "新增多个新闻中心详情")
	public Result<List<SysNews>> addBatch(@RequestBody List<SysNews> sysNewsList)  throws Exception {
		//批量的校验无效，需要自己写校验
		return sysNewsService.saveBatch(sysNewsList)?Result.ok(sysNewsList):Result.error();
	}

	/********************************************************************************
	 * @Title: update
	 * @Description: 更新单个新闻中心详情
	 ********************************************************************************/
	@PostMapping("/edit")
	@ApiOperation(value = "更新单个新闻中心详情", notes = "更新单个新闻中心详情")
	public Result<SysNews> edit(@Valid @RequestBody SysNews sysNews, BindingResult bindingResult)  throws Exception {
		return sysNewsService.updateById(sysNews)?Result.ok(sysNewsService.getById(sysNews.getId())):Result.error();
	}

	/********************************************************************************
	 * @Title: editBatch
	 * @Description: 更新多个新闻中心详情
	 ********************************************************************************/
	@PostMapping("/editBatch")
	@ApiOperation(value = "更新多个新闻中心详情", notes = "更新多个新闻中心详情")
	public Result<List<SysNews>> editBatch(@RequestBody List<SysNews> sysNewsList)  throws Exception {
		//批量的校验无效，需要自己写校验
		return sysNewsService.updateBatchById(sysNewsList)?Result.ok(sysNewsList):Result.error();
	}

	/********************************************************************************
	 * @Title: remove
	 * @Description: 删除单个新闻中心详情
	 ********************************************************************************/
	@PostMapping("/remove/{id}")
	@ApiOperation(value = "删除单个新闻中心详情", notes = "删除单个新闻中心详情")
	public Result<?> remove(@PathVariable(value = "id") Long id)  throws Exception {
		return sysNewsService.removeById(id)?Result.ok():Result.error();
	}
	/**
	 * 获取新闻消息列表展示
	 * @return
	 */
	@GetMapping("/getNews")
	public Result<?> getNews(){
		return sysNewsService.getNews(getTenantId());
	}
	/**
	 * 获取新闻中心可编辑的新闻列表
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	@GetMapping("/getNewsList/{pageNum}/{pageSize}")
	public Result<?> getNewsList(@PathVariable Integer pageNum,@PathVariable Integer pageSize){
		Page page = new Page<>(pageNum, pageSize);
		Long userId = getTenantUserId();
		UserTypeEnum userType =getCurrentUser().getSysTenantUserVO().getUserType();
		if("ADMIN".equals(userType.ADMIN.name())){
			//如果是系统管理员则拉取所有的新闻
			return Result.ok(sysNewsService.page(page, new QueryWrapper<SysNews>()));			
		}else {
			//如果是非管理员用户则只拉取自己发起的新闻
			return Result.ok(sysNewsService.page(page, new QueryWrapper<SysNews>().eq("create_by", userId)));			
		}
	}
}
